IICSでGoogle スプレッドシートに接続してみる
本エントリはクラスメソッド インフォマティカ Advent Calendar 2020のエントリです。
- クラスメソッド インフォマティカ Advent Calendar 2020 - Qiita
- クラスメソッド インフォマティカ Advent Calendar 2020 | 特集カテゴリー | Developers.IO
データアナリティクス事業本部、池田です。
アドベントカレンダー11日目です!
Informatica Intelligent Cloud Services(以下IICS)には
いろいろなコネクタ
がありますが、
今回はGoogle スプレッドシート(Google Sheets、以下スプレッドシート)に接続してみます。
【 Google Sheets Connector Overview 】
補足!!!
スプレッドシートのコネクタでの接続が目的なので、 処理としては単純に Amazon S3 に吐き出すだけにします。
本当にスプレッドシートをS3に吐き出したいだけなら、もちろんIICSを使うまでもなく、 例えば↓のような Google Apps Script(GAS) のライブラリを使うなどの方がたぶん楽です。
また、スプレッドシート→ BigQuery の 連携ができるので、IICSで既に使っているような場合は、 BigQueryを経由するのも可能かもしれません。(気が向いたら試してブログにします。)
↑一度きりのインポートのようなものではなく、スプレッドシートを変更するとBigQuery側も変更されました。(すごい!)
っていう前置きを踏まえて次章から、 スプレッドシート側の準備、IICSでの接続、マッピング機能でのS3出力、と進めていきます。
スプレッドシート(GCP)側の準備(リフレッシュトークンの取得)
スプレッドシートの接続の作成に必要になるリフレッシュトークンを作成します。
スプレッドシートのコネクタは
Google Sheets API を使用しており、
このAPIを使うために必要になるのがリフレッシュトークンです。
けっこうしんどい作業です。以下、ガイドを基に私がやった作業をざっと掲載します。
作業としては、コネクタのガイドの、 Administration of Google Sheets Connector と Generating OAuth 2.0 access tokens を行います。
クライアントIDとクライアントシークレット
Administration of Google Sheets Connector では、GoogleのクライアントIDとクライアントシークレットの取得までを行います。
GCPのコンソールから、Google Sheets APIを有効化します。
OAuth クライアント IDを作成します。
ただし、初めて作成する場合はOAuth 同意画面の設定が求められます。
(今回の用途の範囲に限って言えば、自分が許可する時の画面への影響だけなので、
あまり気にしなくて良い部分ではないかと思います。たぶん。)
設定後にOAuth クライアント IDが作成できるようになります。
↑IICSのガイドでは特に触れていないようでしたが、
私の場合はリダイレクトURIが後の手順で必要になりました。
http://localhost
を設定しました。
作成が完了すると、目当てのクライアントIDとクライアントシークレットを
含むJSONファイルがダウンロードできるようになります。
リフレッシュトークン
Generating OAuth 2.0 access tokens では、Googleのリフレッシュトークンを取得します。
Chromeで↓のURLにつなぎます。前節のクライアントIDとリダイレクトURIを使います。
https://accounts.google.com/o/oauth2/auth?access_type=offline&approval_prompt=auto&client_id={クライアントID}&response_type=code&scope=https://www.googleapis.com/auth/spreadsheets&redirect_uri={リダイレクトURI}
(このURLの scope
により、スプレッドシートのAPI使用の許可が求められます。)
表示される画面(←OAuth 同意画面の設定がここで効いてきます)で許可をしていくと、リダイレクトされます。
そのURLのパラメータの code
が認可コードです。
http://localhost/?code={認可コード}&scope=https://www.googleapis.com/auth/spreadsheets
その認可コードとクライアントID、クライアントシークレットを使ってPOSTリクエストを発行し、
リフレッシュトークンを取得します。
↓私はChromeのデベロッパーツール(F12)でJavaScript動かしてリクエストしました。
fetch('https://accounts.google.com/o/oauth2/token', { method: 'POST', body: JSON.stringify({ "grant_type": "authorization_code", "code":"{認可コード}", "client_id":"{クライアントID}", "client_secret":"{クライアントシークレット}", "redirect_uri":"http://localhost" }) }) .then(response => response.json()) .then(data => { console.log('Success:', data); });
このレスポンスの中に含まれる refresh_token
が、念願のリフレッシュトークンです!!!
※
ここまででリフレッシュトークンが取得できたので、
IICSの ガイド
の『Step 3. Refreshing an access token』(アクセストークン)は、IICSで接続するだけであれば不要だと思います。
また、執筆時点のガイドではgrant_typeにまた authorization_code
を指定してリクエストしていますが、
正しくは refresh_token
(ガイドだと画像の方が正しい)だと思われます。
使用するスプレッドシート
今回使うスプレッドシートは↓こんな感じです。
IMPORTXML 関数を使って、
弊社ブログのページ をスクレイピングしています。
接続してみる
前章長かったですね…ここからが本題です。
コネクタの有効化
「アドオンコネクタ」からコネクタを有効化します。
接続の作成
Google Sheets connection properties
を参考に接続を作成します。
ランタイム環境
は準備しておいたSecure Agentを指定。
Hosted Agent
ではダメでした…
ClientId
と ClientSecret
は前章でさんざん出てきたやつです。
RefreshTokenForSheet
は 前章の最後に取得できたリフレッシュトークン。
SpreadSheetId
は接続したいスプレッドシートのURLから取得できます。
今回のスプレッドシートは1行目がヘッダーなので、 HeaderPresent
をチェック。
( InitialColumnRange
で読込みの開始範囲が指定できるのかと思ったのですが、
いろいろな値を試しましたが、私では効かせられませんでした……)
動かしてみる
接続はできたと言えばできたのですが、 せっかくなのでマッピングを使って処理をしてみます。
Informatica Cloud Data Integrationの最重要ETL機能「Mapping」のチュートリアルをやってみた
出力先(ターゲット)はS3なので、こちらも接続だけ作っておきます。
マッピングの作成&実行
マッピング作っていきます!
マッピングの名称をつけます。
ソース側の設定をします。
前章で作ったスプレッドシートの接続をここで使います。
オブジェクト
でシート名を指定します。
「データのプレビュー」をすると、
スプレッドシートの内容を表示してくれます。
これができれば、リフレッシュトークンやら設定やらはもう大丈夫でしょう!
苦労が報われます。
(さすがに画像の列(img)は空になっていますね。エラーにならないだけでもすごい!)
ターゲット(S3)側の設定も良い感じに仕上げます。
保存後に試しに実行してみます。
(ここの ランタイム環境
もSecure Agentじゃないとダメでした。)
「マイジョブ」から結果を確認できます。
成功!
無事S3にファイルが出力されていました!!!
おわりに
リフレッシュトークンを扱ったことが無い場合には、ちょっとハードルが高い印象を受けました。 IICS上での操作は簡単でしたね。
コネクタはまだまだ たくさんある ので、おもしろそうなものは触ってみたいと思います。たぶん。